查看原文
其他

【综述专栏】基于能量的模型

在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。

作者:知乎—yearn

地址:https://www.zhihu.com/people/zyf-98-4

该文主要是针对:http://yann.lecun.com/exdb/publis/pdf/lecun-06.pdf
有些可视化以及清晰的见解来自ICLR 2020: Yann LeCun and Energy-Based Models(https://youtu.be/piaPIKO1MFY)。所谓的能量模型并不是一种新的技术,而是LeCun的一种尝试:将当前的DL,ML统一在能量模型的框架中。我们先理解一下何为能量函数,能量函数通常写作  ,用于衡量  的 compatibility,也可以理解为  是否匹配,能量越小匹配度越高。
1. 用分类器做一个简单例子,如果输入是猫的图片,那么  ,即分类正确能量函数即为0,所以这里的能量函数其实与损失函数没有太大差别,可能是最大化数据的负对数似然。为了最小化这个能量,我们可以改变label使其适应  (传统的图像分类),也可以改变  来适应label(deepdream)
2. GAN[1]:判别器本身是一个能量函数,真实样本的能量为0。生成器尝试着生成能量更低的样本。
3. Self-supervised:比如我们要从当前帧预测下一帧内容,那么我们需要找到一个帧使得  尽可能小即可。
用综述中的话来讲:基于能量的学习为许多概率和非概率的学习方法提供了一个统一的框架,特别是图模型和其他结构化模型的非概率训练。基于能量的学习可以被看作是预测、分类或决策任务的概率估计的替代方法。由于不需要适当的归一化,基于能量的方法避免了概率模型中与估计归一化常数相关的问题。此外,由于没有标准化条件,在学习机器的设计中允许了更多的灵活性。大多数概率模型都可以看作是特殊类型的基于能量的模型,其中能量函数满足一定的归一化条件,损失函数通过学习优化,具有特定的形式。这里归一化,标准化多次出现,将会在下文进行剖析。
我们比较常用的情况是这样的,给定一张image  ,模型产生与  最兼容的
显然如果  很小的话我们可以遍历所有  进行挑选最小的。但是通常情况下,问题并没有这么简单,我们可以看一下一些应用场景
(a): 人脸识别-Y离散,但是基数成千上万。(b): 人脸检测与姿态估计-Y是一组向量集合。(c)图像分割-Y是每个pixel的标签。(d)(e):手写字体识别与序列标记-Y是一组结构化但取值可能无限的符号(NLP常态)。(f)图像复原-Y是高维数据图像
在这些场景中遍历  空间往往都是不太现实的,因此针对场景我们需要选择合适的近似策略。需要注意的是,能量是没有上界的,在一个model中使用的时候这是没有问题的,比如RL中我们只需要选择能量最低的action即可,但是如果我们需要合并两个model(一个的输出是另一个的输入)就比较麻烦了。唯一一致的方法是将所有可能输出的能量转换成一个标准化的概率分布。最简单、最常用的方法即转化为Gibbs分布
这里的  是逆温度,分母是配分函数。这样的转换只有在配分函数可以计算时才是有效的,但是通常配分函数是得不到的(想象一下在图片这种高维空间做积分),因此概率建模的代价很高,我们应该尽量避免。


01

Energy-Based Training: Architecture and Loss Function

我们训练EBM的初衷就是找一个合适的能量函数,使得其能够对输入的  输出最匹配的  。给定参数  ,我们将这一类能量函数写作
这里就显示出了能量函数的包罗万象,当 是实向量的时候,  可以简单到基函数的线性组合(如核方法),或一组神经网络架构和权值。当  是可变大小的图像、符号序列或向量,或更复杂的结构对象时,  可能代表相当丰富的一类函数。
对现有的预测,分类这些问题,都会给定数据  ,然后我们需要一个损失函数来  评估当前的能量函数的好坏,为了简单起见,我们通常表示它为 。学习问题很简单,就是要找到使损失最小的  :
在大多数情况下,损失函数是如下形式
损失由一个训练集样本损失函数均值和正则化器 组成,后者可以用来引入我们的先验知识,可能是哪类能量函数比其他能量函数更可取(在缺乏训练数据的情况下)。

1.1 Designing a Loss Functional

直观来说损失应该满足如下条件:对一个表现良好的能量函数赋予低损失(如果该能量函数给正确答案的能量最低,其他答案的能量较高),相反损失较高。损失函数需要指导训练过程塑造正确的的surface of energy,如下图所示
即push down正确回答的能量,push up错误回答的能量
其中  是正确答案,  是能量最低的错误答案。
总结一下:给定一个训练集  ,构建和训练一个基于能量的模型需要设计四个部分
1. The architecture,即  的内部结构。
2. The inference algorithm,对任意给定的  求出使  最小的  值的方法。
3. The loss function,用于评估能量函数的好坏
4. The learning algorithm,在给定训练集的能量函数  的泛函族上,找到使得损失最小的参数  的方法。
其中1,3最为重要:我们可能拥有的关于当前任务的任何先验知识都被嵌入到架构和损失函数中(特别是正则化器)。不幸的是,并不是所有架构和损失函数的组合都是允许的。在某些组合下,最小化损失并不能使模型产生最佳答案。对于基于能量的方法来说,选择能够有效学习的架构和损耗函数的组合是至关重要的,因此也是本教程的中心主题。

1.2 Examples of Loss Functions

这一节描述一些ML中常见的损失函数,并讨论他们是否在能量模型中适用,这里暂时不讨论正则化项。

1.2.1 Energy Loss

最简单方便的损失函数即能量损失
他的损失函数,虽然在回归和神经网络训练中非常流行,但不能用于训练大多数架构,因为它只有push down正确答案能量的功能,在有些架构中甚至会使得所有能量都为0。能量损失只会发生在这样一种架构上:push down  会自动使其他答案的能量变大。

1.2.2 Generalized Perceptron Loss

这个损失总是正的,因为第二项是第一项的下界。使这种损失最小化的效果是push down  ,同时push up由模型产生的答案的能量。
该损失应用很广,包括手写字体识别,词性标注都有人使用。但是与energy loss相似,当所有能量都为0时,损失恒为0,因此,只有当使用的模型不能产生平坦的能量面时,才有可能得到一个有意义的、不坍塌的结果。

1.2.3 Generalized Margin Losses

有多种损失函数都可以被称为margin loss,包括hinge loss, log loss, LVQ2 loss, minimum classification error loss, square-square loss, and square-exponential loss,这些损失都致力于在正确与错误答案之间创造一个margin。在讨论这些损失之前,我们先正式定义hard negative sample,
当  是离散值,给定训练数据  ,最难的负样本即能量最低的错误样本
当  是连续值的时候,错误定义为与正确样本的距离大于一个阈值 
generalized margin loss 直接使用难样本
这里  是一个正参数即margin,  是一个凸函数,两种margin loss的实例为
  • Hinge Loss:在支持向量机,支持向量马尔可夫模型中都有广泛应用
 是一个正的margin。当正确答案与最不正确答案之间的能量之差大于  时,将受到线性惩罚。hinge loss仅取决于能量差异,因此,单个能量不受任何特定值的限制。
  • Log loss:是hinge loss的一种变体,比hinge loss更加soft,而且只要有能量差,就会产生loss。
  • Square-Square Loss: 与hingle loss不同的是,平方损耗将正确答案的能量和最令人讨厌的答案的能量分开来处理
正确答案的能量以及错误答案低于  的能量都会被以平方项惩罚。,这样会将正确答案的能量推向0,错误答案的能量推向  以上。
  • LVQ2 Loss:鉴别训练序列标记系统(特别是语音识别系统)的最早方法之一,
这里  是一个正的参数,LVQ2是0-margin loss。这个loss的优越性在于,它可以抑制离群点的影响,只要  ,那么该损失恒为1。
  • MCE Loss(Minimum Classification Error loss):
这里的  是logistic function  。MCE loss和LVQ2 loss一样都是0-margin。
  • Square-Exponential loss:这个损失函数分别处理正确与错误样本,但是与Square-Square Loss不同,该损失是infinite-margin,只要有负样本就存在损失。

1.2.4 Negative Log-Likelihood Loss

使用NLLloss基本上是如下形式
因为配分函数的缘故,这里的难点在于估计这一个配分函数带来的损失,与上述loss不同的是,后面这一项将会push up所有样本的能量,只不过第一项会将正确答案以更大的力度push down.


02

Simple Architectures
为了充实到目前为止所提出的思想,本节演示了如何将简单的分类和回归模型表述为基于能量的模型。这为讨论好的和坏的损失函数,以及讨论结构化预测的高级架构奠定了基础。
Fig 1 (a)回归模型 (b) 单分类 (c)多分类

2.1 Regression

回归模型的损失通常为其输出与目标值的均方误差
推理问题很简单:使  最小的  值等于  。最小能量总是等于零。当与这种架构一起使用时,能量损失、perceptron loss和负对数似然损失都是等价的,因为perceptron loss的对比项是零,而NLL损失的对比项是常数(它是一个方差恒定的高斯积分)。
如果我们认为回归函数是模型参数的线性函数,那么就可以写为
其中  是第  个特征,通过这种线性参数化,能量损失的训练减少为一个容易解决的最小二乘最小化问题,这是一个凸问题:
在简单的模型中,特征函数是由设计者手工制作的,或者从未标记的数据中单独训练出来的。在核方法的对偶形式中,  其中k是核函数。在更复杂的模型中,如多层神经网络等,  本身可能被参数化并可学习,在这种情况下,回归函数不再是参数的线性函数,因此损失函数在参数中可能不是凸函数。

2.2 Two-Class Classifier

Fig 1(b)显示了一个简单的两类分类器体系结构。要预测的变量为二进制:  。能量函数可以定义为:
其中  是由  参数化的标量值判别函数。推理同样很简单:
学习可以使用许多不同的损失函数来完成,包括perception损失、hinge损失和负对数似然损失。如果使用perception loss,那么把能量带入该损失得到
此时使用梯度下降得到
同样的,我们通过线性参数化能够得到
同理hinge loss可以写为如下形式,如果我们取  ,正则化项取  的话就得到了线性的支持向量机
因为此时我们有  ,所以最大似然损失也是容易计算的

2.3 Multiclass Classifier

一个判别函数  产生一个输出向量  每个  类别都有一个组件。每个组件  都可以被解释为将X赋值给第j类的惩罚。一个离散交换模块选择所述组件中的哪一个连接到所述输出能量。开关的位置由类别变量  决定。输出能量等于
其中  时 否则  。inference阶段是将  设置为  最小分量的索引。和二分类类似,上述损失函数都可以容易的转化为多分类损失。

2.4 Implicit Regression

上述的模型都是有准确答案的,但是有时候并不是如此。比如机器人导航,向左或向右转弯都可以很好地绕过障碍,或者一种语言模型,在句子“猫吃了”之后,同样可以很好地接“老鼠”或“鸟”。总结一下就是  之间的依赖不能简单地用一个函数将  映射到  。这被称之为隐性回归(implicit regression),这时候能量函数就派上了用场,它本身就很适合测量两个输入是否兼容,一个简单的例子是
一个典型的例子是siamese architecture,当输入是同一类时最小化他们的能量,否则最大化。如果我们没有label,使用data argumentation来创造同类样本,这就变成了contrastive learning的模样。arxiv.org/pdf/2006.0743.


03

Latent Variable Architectures
能量最小化是描述推理和推理的一般过程的一种简便方法。在通常的场景中,对于被预测的变量  ,能量是最小的,给定观测变量  ,在训练中,每个训练样本都给出正确的  值。然而,在许多应用中,我们只能得到一组隐藏变量  ,但是没有数据标签。对于这些架构,推理的过程就涉及到  了
特别的,我们可以通过将潜在变量存在时的推理过程视为同时在  上最小化
隐变量  也可以看作是在寻找最优  过程中的中间变量,但是他们还是有本质区别的,  有正确值但是  并没有。当建模过程的隐藏特征可以从观察结果中推断出来,但不能直接预测时,潜在变量非常有用。其中一个例子就是识别问题。例如,在人脸识别中,一个人的性别或脸的朝向可能是一个潜在变量。知道这些值会使识别任务变得容易得多。在语音识别中,句子切分成词和词切分成音素必须在识别的同时进行,但是在训练过程中很难得到正确的切分成音素。同样,在手写识别中,将单词分割成字符也要与识别同时进行。

3.1 An Example of Latent Variable Architecture

考虑一个人脸识别系统,我们有一个检测函数  ,如果有人脸就输出一个比较大的值,否则输出比较小的,此时我们可以建立如下基于能量的模型
(a): 基于能量的模型。给定一幅图像,当图像中有人脸时输出一个小值,当图像中没有人脸时输出一个高值,等于阈值T。(b) 利用人脸的位置作为潜在变量,同时对输入图像中的人脸进行定位和检测
对于(a)图的结构而言,可以看作利用  来控制一个二值的开关,当有face的时候,能量为  ,否则输出一个比较大的值  。
此时使得能量最小的  即当有脸的时候  为1,否则为0.
更复杂的场景:检测并定位人脸,我们可以将  用在图片的多个window上来检测哪个window的  最低,查看是否该位置有  。潜在位置变量  选择  函数的  个拷贝中的哪一个被路由到输出能量。能量函数可以写成
其中  是图像窗口。在图像中定位得分最好的位置,关键在于将关于  的能量最小化。  的结果值将表明是否找到了人脸,  的结果值将表明位置。


04

Analysis of Loss Functions for Energy-Based Models
本节讨论损失函数必须满足的条件。为了直观地了解这个问题,我们首先描述一些简单的实验,在这些实验中,某些体系结构和损失函数的组合被用来学习一个简单的数据集,结果各不相同。5.2节给出了更正式的处理方法。

4.1 “Good” and “Bad” Loss Functions

这里conduct一个很简单的实验,
数据集:  ,即给X输出他的平方
网络结构如下图(a),  是两层的神经网络。能量函数类似上面回归问题的setting,这时损失函数即

这相当于只是push down训练样本周围的能量,而不考虑energy surface的其他地方。在这种情况下,损失函数的变化趋势如下,可以看到,算法是逐渐收敛的,最后能量表面达到了理想的形状,训练样本(黑点)周围的能量较低,其他点的能量都很高
我们也可以考虑一个稍微复杂一点的场景 结构图(b),  分别被  编码,这两个encoder都是10个隐层单元,10个输出单元的NN,此时能量为
用能量损失训练这个架构会导致能量表面的崩溃。如下图所示,为什么会发生这样事情?因为在该能量损失的情况下,没有任何机制可以阻止G1和G2忽略它们的输入并产生相同的输出值。这导致了能量面是平坦的,处处等于零。
在同样的架构下,我们选择square-square loss会发生啥事情呢
这里的 是一个正的margin,  是最不正确的答案,第二项通过指出那些能量应该被push up有效地防止了模型的崩溃,此时energy surface变成了正常的模样
另一个与这种架构配合良好的损失函数是负对数似然损失:
第一项拉低了期望答案的能量,而第二项推高了所有答案,尤其是那些能量低的(虽然也包含了正确答案,但是第一项push down的力度更大)。NLL损失学习速度更快,因为后面的这一项将其他答案的能量推向无穷,而不仅仅是square-square loss中的  ,但是我们也要知道每一次负对数似然损失的迭代都涉及相当多的工作,因为当第二项的导数不存在解析表达式时计算代价很高。在这个实验中,作者使用了一种简单的采样方法:将积分近似为在Y方向上以-1和+1为间隔的20个点的和。因此,每次学习迭代都需要计算20个位置的能量梯度,而在square square loss的情况下则需要计算2个位置的能量梯度。当然后者需要找到最不正确的答案,这也需要考虑其中。
NLL作为概率建模的一种方式,还有一个地方需要注意。能量值的绝对大小不决定答案的正确与否,相反,答案的正确与否只取决于给定X的y的能量差异。所以一个答案的质量不能在不考虑所有其他答案能量的情况下,用该答案的能量来衡量(相当于我们要做softmax才能得到概率值)。

4.2 Sufficient Conditions for Good Loss Functions

这一节中给出了一组充分条件。能量函数和损失函数必须满足这些条件,才能保证在以能量为基础的环境中工作。然后我们从这些条件的角度讨论了前面介绍的损失函数的性质。

4.3 Conditions on the Energy

通常在基于能量的学习中,推理方法选择能量最小的答案。因此,对样本  进行正确推断的条件如下。
即  能量最小。为了确保这个正确答案比较robust,我们可以引入一个margin  使得该答案的能量至少比最错误的答案  能量小 

4.4 Sufficient Conditions on the Loss Functional

一个合格的损失函数,应该做到最小化该损失函数能够使得  比错误答案的能量  至少小  。因为只有两个能量的相对大小是有意义的,绝对值没意义,因此我们只需要考虑这两个能量在二维空间中的损失泛函切片的形状。比如当  是1-K的整数,此时损失函数可以写作
这一损失在  和  空间中的投影可以被视为由除过  其他  个能量参数化的函数  :
这里的  就是这  个能量值。
我们以  为横坐标,  为纵坐标画一个三维图(第三维是对应的loss)。一般来说,损失函数是三维空间中的二维曲面族,其中每个曲面对应于所有能量的一种特定构型。我们定义  和  的空间分别为  ,定义一个可行域  ,所谓的可行域就是任意  可以算出的  ,可行域可以是非凸的,不连续的,开放的,或者一维的,可以在平面上的任何地方,即下图中的阴影部分。
根据我们上述的condition 2,  必须与 相交,因为至少要有一个点满足  。我们在  中取两个点,  ,依靠他们来定义我们对损失函数的充分条件
换句话说,在  至少存在一个点,该点的损失比其他在  中的点的损失都小。当然这只是一个充分条件,并不是必要条件。以下是常见损失函数何时满足该条件
margin>0表示任何大于0的margin都满足,none表示并不满足

4.5 Which Loss Functions are Good or Bad

这一节对上表中的一些结果进行分析

4.5.1 Energy Loss

一般来说,能量损失是一个不好的损失函数,但在某些形式的能量中,它是一个好的损失函数。例如,考虑一个能量函数的形式
这个能量通过  个径向基函数(对应于每个类)传递函数  的输出,径向基函数的中心记作  。如果每个中心  是固定且不同的,那么能量损失满足条件3,因此是一个很好的损失函数,我们现在分析一下如何得到这样一个结论,从简单情况开始不妨考虑一个两类的场景,此时网络结构基本如下
令  ,因为每个径向基的中心是固定而且不同的,所以  是  的一个strict lower bound。因为是二分类问题,所以一个是  另一类必是 。函数的可行域即  如下图所示。只要  损失函数就满足condition 3.(如果  那意味着可行域中某些点  ,此时显然不可能  ),如果满足了  那么从图中可以看到我们的energy surface基本上单调的,因此condition很容易满足。
(a)当使用具有固定和不同的RBF中心的RBF体系结构时,只允许(EC, EI)平面的阴影区域。无阴影区域是不可达到的,因为两个输出的能量不可能同时很小。在阴影区域和纵轴的交点处能量损失最小 (b)能量损失的三维图。较浅的阴影表示较高的损失,较深的阴影损失较小。

4.5.2 Generalized Perceptron Loss

该损失的范围为零。因此,它可能导致能量面塌陷,一般不适合训练基于能量的模型。但是margin为0并没有想象的那么严重,首先能量面的塌陷只会发生在参数空间的一小片,而且虽然我们没有阻止模型塌陷的策略,但是同样也不会推动他走向这片参数空间,总而言之发生塌陷的概率还是比较小的。

4.5.3 Generalized Margin Loss

接下来看看square-square and square-exponential两个损失函数,损失函数的surface可视化结果如下,当energy surface呈现出这么一种单调性的趋势并且在靠近  的地方越来越小,那么condition 3都是很好满足的。
(a) square-square loss:当我们从HP2移动到HP1时,损失逐渐减小。(b)The square-exponential loss:与前者变化趋势相同。

4.5.4 Negative Log-Likelihood Loss

这个函数的证明不是很直观,需要稍微复杂一点的数学变化,就不展开了。


05

EBMs versus Internally Normalized Models
EBM有一个需要注意,也是他优势比较大的地方,就是我们不需要操作归一化后的概率分布,EBM唯一操作的东西是他的能量。这与隐马尔可夫(HMM)和传统的贝叶斯模型是不同的。在hmm中,节点的射出转移概率之和必须为1,射入概率必须适当归一化。这确保了序列的总体分布是标准化的。同样,在有向贝叶斯网中,条件概率表的行是规范化的。EBM操纵能量,因此无需归一化,只有在能量被转化为概率的时候,我们才需要对进行归一化。jiyunen概率
参考:https://zhuanlan.zhihu.com/p/264759885


本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“综述专栏”历史文章


更多综述专栏文章,

请点击文章底部“阅读原文”查看



分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存